Introduction |
xiii | ||||
| New and Extended Features in MASM 6.1 | xiii | ||||
| MASM Features New Since Version 5.1 | xiv | ||||
| MASM Features New Since Version 6.0 | xv | ||||
| ML and MASM Command Lines | xvi | ||||
| Compatibility with Earlier Versions of MASM | xvi | ||||
| A Word About Instruction Timings | xvii | ||||
| Books for Further Reading | xviii | ||||
| Document Conventions | xix | ||||
| Getting Assistance and Reporting Problems | xx | ||||
Chapter 1 Understanding Global Concepts |
1 | ||||
| The Processing Environment | 1 | ||||
| 8086-Based Processors | 2 | ||||
| Operating Systems | 4 | ||||
| Segmented Architecture | 5 | ||||
| Segment Protection | 6 | ||||
| Segmented Addressing | 7 | ||||
| Segment Arithmetic | 7 | ||||
| Language Components of MASM | 8 | ||||
| Reserved Words | 8 | ||||
| Identifiers | 9 | ||||
| Predefined Symbols | 10 | ||||
| Integer Constants and Constant Expressions | 11 | ||||
| Operators | 13 | ||||
| Data Types | 14 | ||||
| Registers | 16 | ||||
| Statements | 21 | ||||
| The Assembly Process | 22 | ||||
| Generating and Running Executable Programs | 23 | ||||
| Using the OPTION Directive | 24 | ||||
| Conditional Directives | 28 | ||||
Chapter 2 Organizing Segments |
31 | ||||
| Physical Memory Segments | 32 | ||||
| Logical Segments | 32 | ||||
| Using Simplified Segment Directives | 33 | ||||
| Defining Basic Attributes with .MODEL | 34 | ||||
| Specifying a Processor and Coprocessor | 38 | ||||
| Creating a Stack | 38 | ||||
| Creating Data Segments | 39 | ||||
| Creating Code Segments | 40 | ||||
| Starting and Ending Code with .STARTUP and .EXIT | 41 | ||||
| Using Full Segment Definitions | 44 | ||||
| Defining Segments with the SEGMENT Directive | 44 | ||||
| Controlling the Segment Order | 47 | ||||
| Setting the ASSUME Directive for Segment Registers | 49 | ||||
| Defining Segment Groups | 51 | ||||
Chapter 3 Using Addresses and Pointers |
53 | ||||
| Programming Segmented Addresses | 53 | ||||
| Initializing Default Segment Registers | 53 | ||||
| Near and Far Addresses | 57 | ||||
| Operands | 60 | ||||
| Register Operands | 61 | ||||
| Immediate Operands | 61 | ||||
| Direct Memory Operands | 62 | ||||
| Indirect Memory Operands | 64 | ||||
| The Program Stack | 71 | ||||
| Saving Operands on the Stack | 71 | ||||
| Saving Flags on the Stack | 73 | ||||
| Saving Registers on the Stack (80186-80486 Only) | 74 | ||||
| Accessing Data with Pointers and Addresses | 74 | ||||
| Defining Pointer Types with TYPEDEF | 75 | ||||
| Defining Register Types with ASSUME | 77 | ||||
| Basic Pointer and Address Operations | 78 | ||||
Chapter 4 Defining and Using Simple Data Types |
85 | ||||
| Declaring Integer Variables | 85 | ||||
| Allocating Memory for Integer Variables | 85 | ||||
| Data Initialization | 87 | ||||
| Working with Simple Variables | 88 | ||||
| Copying Data | 89 | ||||
| Adding and Subtracting Integers | 92 | ||||
| Multiplying and Dividing Integers | 95 | ||||
| Manipulating Numbers at the Bit Level | 98 | ||||
| Logical Instructions | 99 | ||||
| Shifting and Rotating Bits | 100 | ||||
| Multiplying and Dividing with Shift Instructions | 102 | ||||
Chapter 5 Defining and Using Complex Data Types |
105 | ||||
| Arrays and Strings | 105 | ||||
| Declaring and Referencing Arrays | 105 | ||||
| Declaring and Initializing Strings | 108 | ||||
| Processing Strings | 110 | ||||
| Structures and Unions | 117 | ||||
| Declaring Structure and Union Types | 118 | ||||
| Defining Structure and Union Variables | 121 | ||||
| Referencing Structures, Unions, and Fields | 126 | ||||
| Nested Structures and Unions | 128 | ||||
| Records | 129 | ||||
| Declaring Record Types | 130 | ||||
| Defining Record Variables | 131 | ||||
| Record Operators | 133 | ||||
Chapter 6 Using Floating-Point and Binary Coded Decimal Numbers |
135 | ||||
| Using Floating-Point Numbers | 136 | ||||
| Declaring Floating-Point Variables and Constants | 136 | ||||
| Storing Numbers in Floating-Point Format | 138 | ||||
| Using a Math Coprocessor | 139 | ||||
| Coprocessor Architecture | 140 | ||||
| Instruction and Operand Formats | 141 | ||||
| Coordinating Memory Access | 145 | ||||
| Using Coprocessor Instructions | 146 | ||||
| Using An Emulator Library | 155 | ||||
| Using Binary Coded Decimal Numbers | 156 | ||||
| Defining BCD Constants and Variables | 157 | ||||
| BCD Calculations on a Coprocessor | 157 | ||||
| BCD Calculations on the Main Processor | 158 | ||||
Chapter 7 Controlling Program Flow |
161 | ||||
| Jumps | 161 | ||||
| Unconditional Jumps | 162 | ||||
| Conditional Jumps | 164 | ||||
| Loops | 172 | ||||
| Loop-Generating Directives | 173 | ||||
| Writing Loop Conditions | 178 | ||||
| Procedures | 180 | ||||
| Defining Procedures | 180 | ||||
| Passing Arguments on the Stack | 182 | ||||
| Declaring Parameters with the PROC Directive | 184 | ||||
| Using Local Variables | 188 | ||||
| Creating Local Variables Automatically | 190 | ||||
| Declaring Procedure Prototypes | 193 | ||||
| Calling Procedures with INVOKE | 194 | ||||
| Generating Prologue and Epilogue Code | 198 | ||||
| MS-DOS Interrupts | 204 | ||||
| Calling MS-DOS and ROM-BIOS Interrupts | 204 | ||||
| Replacing an Interrupt Routine | 206 | ||||
Chapter 8 Sharing Data and Procedures Among Modules and Libraries |
211 | ||||
| Selecting Data-Sharing Methods | 211 | ||||
| Sharing Symbols with Include Files | 212 | ||||
| Organizing Modules | 212 | ||||
| Declaring Symbols Public and External | 214 | ||||
| Positioning External Declarations | 228 | ||||
| Using Alternatives to Include Files | 219 | ||||
| PUBLIC and EXTERN | 220 | ||||
| Other Alternatives | 221 | ||||
| Developing Libraries | 221 | ||||
| Associating Libraries with Modules | 222 | ||||
| Using EXTERN with Library Routines | 223 | ||||
Chapter 9 Using Macros |
225 | ||||
| Text Macros | 226 | ||||
| Macro Procedures | 226 | ||||
| Creating Macro Procedures | 227 | ||||
| Passing Arguments to Macros | 228 | ||||
| Specifying Required and Default Parameters | 229 | ||||
| Defining Local Symbols in Macros | 232 | ||||
| Assembly-Time Variables and Macro Operators | 233 | ||||
| Text Delimiters and the Literal-Character Operator | 234 | ||||
| Expansion Operator | 235 | ||||
| Substitution Operator | 237 | ||||
| Defining Repeat Blocks with Loop Directives | 239 | ||||
| REPEAT Loops | 240 | ||||
| WHILE Loops | 241 | ||||
| FOR Loops and Variable-Length Parameters | 242 | ||||
| FORC Loops | 244 | ||||
| String Directives and Predefined Functions | 245 | ||||
| Returning Values with Macro Functions | 248 | ||||
| Returning Values with EXITM | 248 | ||||
| Using Macro Functions with Variable-Length Parameter Lists | 249 | ||||
| Expansion Operator in Macro Functions | 251 | ||||
| Advanced Macro Techniques | 251 | ||||
| Defining Macros within Macros | 251 | ||||
| Testing for Argument Type and Environment | 252 | ||||
| Using Recursive Macros | 255 | ||||
Chapter 10 Writing a Dynamic-Link Library For Windows |
257 | ||||
| Overview of DLLs | 257 | ||||
| Loading a DLL | 258 | ||||
| Building a DLL | 260 | ||||
| DLL Code | 261 | ||||
| DLL Data | 265 | ||||
| DLL Stack | 265 | ||||
| DLL Extension Names | 266 | ||||
| Summary | 266 | ||||
| Example of a DLL: SYSINFO | 267 | ||||
| Entry Routine for SYSINFO | 268 | ||||
| Expanding SYSINFO | 270 | ||||
Chapter 11 Writing Memory-Resident Software |
273 | ||||
| Terminate-and-Stay-Resident Programs | 273 | ||||
| Structure of a TSR | 274 | ||||
| Passive TSRs | 274 | ||||
| Active TSRs | 275 | ||||
| Interrupt Handlers in Active TSRs | 275 | ||||
| Auditing Hardware Events for TSR Requests | 275 | ||||
| Monitoring System Status | 277 | ||||
| Determining Whether to Invoke the TSR | 279 | ||||
| Example of a Simple TSR: ALARM | 279 | ||||
| Using MS-DOS in Active TSRs | 285 | ||||
| Understanding MS-DOS Stacks | 285 | ||||
| Determining MS-DOS Activity | 285 | ||||
| Interrupting MS-DOS Functions | 286 | ||||
| Monitoring the Critical Error Flag | 287 | ||||
| Preventing Interference | 288 | ||||
| Trapping Errors | 288 | ||||
| Preserving an Existing Condition | 289 | ||||
| Preserving Existing Data | 290 | ||||
| Communicating Through the Multiplex Interrupt | 290 | ||||
| The Multiplex Handler | 291 | ||||
| Using the Multiplex Interrupt Under MS-DOS Version 2.x | 292 | ||||
| Deinstalling a TSR | 292 | ||||
| Example of an Advanced TSR: SNAP | 293 | ||||
| Building SNAP.EXE | 294 | ||||
| Outline of SNAP | 295 | ||||
Chapter 12 Mixed-Language Programming |
307 | ||||
| Naming and Calling Conventions | 308 | ||||
| Naming Conventions | 309 | ||||
| The C Calling Convention | 309 | ||||
| The Pascal Calling Convention | 310 | ||||
| The STDCALL and SYSCALL Calling Conventions | 311 | ||||
| Writing an Assembly Procedure For a Mixed-Language Program | 312 | ||||
| The MASM/High-Level-Language Interface | 313 | ||||
| The C/MASM Interface | 315 | ||||
| The C++/MASM Interface | 322 | ||||
| The FORTRAN/MASM Interface | 323 | ||||
| The Basic/MASM Interface | 328 | ||||
Chapter 13 Writing 32-Bit Applications |
335 | ||||
| 32-Bit Memory Addressing | 335 | ||||
| MASM Directives for 32-Bit Programming | 336 | ||||
| Sample Program | 337 | ||||
Appendixes |
|||||
Appendix A Differences Between MASM 6.1 and 5.1 |
341 | ||||
| New Features of Version 6.1 | 342 | ||||
| The Assembler, Environment, and Utilities | 342 | ||||
| Segment Management | 343 | ||||
| Data Types | 344 | ||||
| Procedures, Loops, and Jumps | 347 | ||||
| Simplifying Multiple-Module Projects | 348 | ||||
| Expanded State Control | 349 | ||||
| New Processor Instructions | 350 | ||||
| Renamed Directives | 350 | ||||
| Macro Enhancements | 351 | ||||
| MASM 6.1 Programming Practices | 352 | ||||
| Compatibility Between MASM 5.1 and 6.1 | 352 | ||||
| Rewriting Code for Compatibility | 353 | ||||
| Using the OPTION Directive | 361 | ||||
| Changes to Instruction Encodings | 377 | ||||
Appendix B BNF Grammar |
379 | ||||
Appendix C Generating and Reading Assembly Listings |
397 | ||||
| Generating Listing Files | 397 | ||||
| Precedence of Command-Line Options and Listing Directives | 399 | ||||
| Reading the Listing File | 399 | ||||
| Generated Code | 399 | ||||
| Error Messages | 400 | ||||
| Symbols and Abbreviations | 400 | ||||
| Reading Tables in a Listing File | 404 | ||||
Appendix D MASM Reserved Words |
407 | ||||
| Operands and Symbols | 407 | ||||
| Special Operands for the 80386/486 | 409 | ||||
| Predefined Symbols | 409 | ||||
| Registers | 409 | ||||
| Operators and Directives | 410 | ||||
| Processor Instructions | 412 | ||||
| 8086/8088 Processor Instructions | 412 | ||||
| 80186 Processor Instructions | 413 | ||||
| 80286 Processor Instructions | 413 | ||||
| 80286 and 80386 Privileged-Mode Instructions | 413 | ||||
| 80386 Processor Instructions | 413 | ||||
| 80486 Processor Instructions | 414 | ||||
| Instruction Prefixes | 414 | ||||
| Coprocessor Instructions | 414 | ||||
| 8087 Coprocessor Instructions | 414 | ||||
| 80287 Privileged-Mode Instruction | 415 | ||||
| 80387 Instructions | 415 | ||||
Appendix E Default Segment Names |
417 | ||||
Glossary |
421 | ||||
Index |
435 | ||||
Figures and Tables |
|||||
Figures |
|||||
| 1.1 Segment Allocation | 6 | ||||
| 1.2 Calculating Physical Addresses | 8 | ||||
| 1.3 Registers for 8088-80286 Processors | 17 | ||||
| 1.4 Extended Registers for the 80386/486 Processors | 18 | ||||
| 1.5 Flags for 8088-80486 Processors | 20 | ||||
| 3.1 Stack Status Before and After Pushes and Pops | 72 | ||||
| 4.1 Integer Formats | 87 | ||||
| 4.2 Shifts and Rotates | 101 | ||||
| 6.1 Encoding for Real Numbers in IEEE Format | 138 | ||||
| 6.2 Coprocessor Data Registers | 140 | ||||
| 6.3 Status of the Register Stack | 142 | ||||
| 6.4 Status of the Register Stack and Memory Locations | 143 | ||||
| 6.5 Status of the Previously Initialized Register Stack | 144 | ||||
| 6.6 Status of the Already Initialized Register Stack | 144 | ||||
| 6.7 Status of the Register Stack: Main Memory and Coprocessor | 148 | ||||
| 6.8 Coprocessor Control Registers | 154 | ||||
| 6.9 Coprocessor and Processor Control Flags | 155 | ||||
| 7.1 Program Arguments on the Stack | 183 | ||||
| 7.2 Local Variables on the Stack | 190 | ||||
| 7.3 Operation of Interrupts | 206 | ||||
| 8.1 Using EXTERNDEF for Variables | 215 | ||||
| 8.2 Using PROTO and INVOKE | 217 | ||||
| 8.3 Using PUBLIC and EXTERN | 221 | ||||
| 11.1 Time Line of Interaction Between Interrupt Handlers for a Typical TSR | 278 | ||||
| 11.2 Flowchart for SNAP.EXE: Installation Phase | 296 | ||||
| 11.3 Flowchart for SNAP.EXE Resident Phase | 297 | ||||
| 11.4 Flowchart for SNAP.EXE Deinstallation Phase | 298 | ||||
| 12.1 C String Format | 316 | ||||
| 12.2 C Stack Frame | 320 | ||||
| 12.3 FORTRAN String Frame | 324 | ||||
| 12.4 FORTRAN Stack Frame | 327 | ||||
| 12.5 Basic String Descriptor Format | 330 | ||||
| 12.6 Basic Stack Frame | 333 | ||||
| B.1 BNF Definition of the TYPEDEF Directive | 380 | ||||
Tables |
|||||
| 1.1 8086 Family of Processors | 2 | ||||
| 1.2 The MS-DOS and Windows Operating Systems Compared | 4 | ||||
| 1.3 Operator Precedence | 14 | ||||
| 2.1 Attributes of Memory Models | 35 | ||||
| 3.1 Indirect Addressing with 16-Bit Registers | 68 | ||||
| 4.1 Division Operations | 97 | ||||
| 5.1 Requirements for String Instructions | 112 | ||||
| 6.1 Ranges of Floating-Point Variables | 136 | ||||
| 6.2 Coprocessor Operand Formats | 141 | ||||
| 6.3 Control-Flag Settings After Comparison or Test | 151 | ||||
| 7.1 Conditional Jumps Based on Comparisons of Two Values | 167 | ||||
| 9.1 MASM Macro Operators | 234 | ||||
| 11.1 MS-DOS Internal Stacks | 286 | ||||
| 12.1 Naming and Calling Conventions | 309 | ||||
| 12.2 Register Conventions for Simple Return Values | 317 | ||||
| A.1 Requirements for String Instructions | 353 | ||||
| C.1 Options for Generating or Modifying Listing Files | 398 | ||||
| C.2 Symbols and Abbreviations in Listings | 400 | ||||
| C.3 Symbols in Timing Column | 401 | ||||
Questions:
Interested: